package l1j.server.server.serverpackets;

import java.util.List;

import l1j.server.server.model.Instance.L1ItemInstance;

// Referenced classes of package l1j.server.server.serverpackets:
// ServerBasePacket

public class S_InvList extends ServerBasePacket {

	private static String S_INV_LIST = "[S] S_InvList";

	/**
	 * インベントリにアイテムを複数個まとめて追加する。
	 */
	public S_InvList(final List<L1ItemInstance> items) {
		this.writeC(S_OPCODE_INVLIST);
		this.writeC(items.size()); // アイテム数
		for (final L1ItemInstance item : items) {
			this.writeD(item.getId());
			switch (item.getItem().getItemId()) {
			case 40318:// TODO 道具物品判斷
				this.writeH(166);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 40319:// TODO 道具物品判斷
				this.writeH(569);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 40321:// TODO 道具物品判斷
				this.writeH(837);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49158:// TODO 道具物品判斷
				this.writeH(3674);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49157:// TODO 道具物品判斷
				this.writeH(3605);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49156:// TODO 道具物品判斷
				this.writeH(3606);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			default:
				this.writeH(0);// TODO 3.53C新增封包
				break;
			}
			final int type = Math.max(0, item.getItem().getUseType());

			if (type == 96 || type >= 98) {
				this.writeC(26);
			} else if (type == 97) {
				this.writeC(27);
			} else {
				this.writeC(type);// TODO 使用類型
			}
			if (item.getChargeCount() > 0) {
				this.writeC(item.getChargeCount());// TODO 可用次數
			} else {
				this.writeC(0x00);// TODO 可用次數
			}
			this.writeH(item.get_gfxid());// TODO 圖示
			this.writeC(item.getBless());// TODO 祝福狀態(是否祝福 0=祝福 1=普通 2=詛咒)
			this.writeD((int) item.getCount());// TODO 數量
			int statusX = 0;
			if (item.isIdentified()) {
				statusX |= 1;

				if (!item.getItem().isTradable()) {// TODO 是否可交易道具(是否可以交易 0可
					// 1不可)//opqlo 新增GM 可以交易
					// 不能交易物品(需修改封包傳送方式)
					statusX |= 2;
				}
				if (item.getItem().isCantDelete()) {// TODO 是否可刪除道具(是否可刪除 0可 1不可)
					statusX |= 4;
				}
				if (item.getItem().get_safeenchant() < 0
						|| item.getItem().getUseType() == -3
						|| item.getItem().getUseType() == -2) {
					statusX |= 8;
				}
				if (item.getBless() >= 128) {// TODO 祝福狀態(是否祝福 0=祝福 1=普通 2=詛咒)
					statusX = 32;
					if (item.isIdentified()) {
						statusX |= 1;
						statusX |= 2;
						statusX |= 4;
						statusX |= 8;
					} else {
						statusX |= 2;
						statusX |= 4;
						statusX |= 8;
					}
				}
			}
			this.writeC(statusX);
			this.writeS(item.getViewName());// TODO 名稱
			if (!item.isIdentified()) {
				// 未鑑定の場合ステータスを送る必要はない
				this.writeC(0x00);
			} else {
				final byte[] status = item.getStatusBytes();
				this.writeC(status.length);
				for (final byte b : status) {
					this.writeC(b);
				}
			}
			this.writeC(10);// TODO 3.53C新增封包
			this.writeH(0);// TODO 3.53C新增封包
			this.writeD(0);// TODO 3.53C新增封包
			this.writeD(0);// TODO 3.53C新增封包
		}
	}

	public S_InvList(final List<L1ItemInstance> items, final int i) {
		this.writeC(S_OPCODE_INVLIST);
		this.writeC(items.size()); // アイテム数

		for (final L1ItemInstance item : items) {
			this.writeD(item.getId());
			switch (item.getItem().getItemId()) {
			case 40318:// TODO 道具物品判斷
				this.writeH(166);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 40319:// TODO 道具物品判斷
				this.writeH(569);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 40321:// TODO 道具物品判斷
				this.writeH(837);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49158:// TODO 道具物品判斷
				this.writeH(3674);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49157:// TODO 道具物品判斷
				this.writeH(3605);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			case 49156:// TODO 道具物品判斷
				this.writeH(3606);// TODO 似乎是道具物品編號圖示封包判斷
				break;
			default:
				this.writeH(0);// TODO 3.53C新增封包
				break;
			} // TODO 3.53C

			// 3.52C
			// writeC(item.getItem().getUseType());
			// writeC(0);

			// TODO 3.53C start
			final int type = Math.max(0, item.getItem().getUseType());
			// if (type == 96 || type >= 98){ // unknown type (tw only)
			// writeC(26);
			// } else if (type == 97){ // unknown type (tw only)
			// writeC(27);
			// } else {
			this.writeC(type);
			// }
			final int count = Math.max(0, item.getChargeCount());
			this.writeC(count);
			// TODO 3.53C end

			this.writeH(item.get_gfxid());
			this.writeC(item.getBless());
			this.writeD((int) item.getCount());
			this.writeC(item.isIdentified() ? 1 : 0);
			this.writeS(item.getViewName());
			if (!item.isIdentified()) {
				// 未鑑定の場合ステータスを送る必要はない
				this.writeC(0);
			} else {
				final byte[] status = item.getStatusBytes();
				this.writeC(status.length);
				for (final byte b : status) {
					this.writeC(b);
				}
			}
			// TODO 3.53C start
			this.writeC(10);
			this.writeD(0);
			this.writeD(0);
			this.writeH(0);
			// TODO 3.53C end
		}
	}

	@Override
	public byte[] getContent() {
		return this._bao.toByteArray();
	}

	@Override
	public String getType() {
		return S_INV_LIST;
	}
}
